package com.sojson.util.pay.ali.bean;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.sojson.base.impl.BaseUtilDto;
import com.sojson.config.exception.TransErrorCode;
import com.sojson.config.exception.bean.Status;
import com.sojson.util.json.JsonUtil;
import com.sojson.util.pay.ali.bean.child.response.AliResFundBill;
import com.sojson.util.pay.ali.bean.child.response.AliResVoucherDetail;

/**
 * 支付宝普通接口响应Bean
 * 
 * @author liu
 * @date 2021-03-16
 */
public class AliResponse extends BaseUtilDto {

    /***/
    private static final long serialVersionUID = -444894164284969796L;

    /**
     * 以下是公共参数
     */
    /** 通知的发送时间 */
    private Date notifyTime;
    /** 通知类型 */
    private String notifyType;
    /** 通知校验ID */
    private String notifyId;
    /** 响应内容编码格式 */
    private String charset;
    /** 调用的接口版本 */
    private String version;
    /** 签名类型 */
    private String signType;
    /** 签名 */
    private String sign;
    /** 授权方的 appid(由于某些接口暂不开放第三方应用授权,因此auth_app_id=app_id) */
    private String authAppId;

    /**
     * 以下为认证授权参数
     */
    /** 用户授权码 */
    private String authCode;
    /** 商户自定义参数 */
    private String state;
    /** 授权范围 */
    private String scope;

    /**
     * 以下为业务参数
     */
    /** 支付宝交易凭证号 */
    private String tradeNo;
    /** 开发者的Appid */
    private String appId;
    /** 商户订单号 */
    private String outTradeNo;
    /** 退款回调为(商户业务号(商户业务ID,主要是退款通知中返回退款申请的流水号,商户的退款单号)),转账为(商户订单号) */
    private String outBizNo;
    /** 买家支付宝用户号(买家支付宝账号对应的支付宝唯一用户号,以2088开头的纯16位数字) */
    private String buyerId;
    /** 卖家支付宝用户号(买家支付宝账号对应的支付宝唯一用户号,以2088开头的纯16位数字) */
    private String sellerId;
    /** 交易状态 */
    private String tradeStatus;
    /** 订单金额(本次交易支付的订单金额) */
    private BigDecimal totalAmount;
    /** 实收金额(商家在交易中实际收到的款项) */
    private BigDecimal receiptAmount;
    /** 开票金额(用户在交易中支付的可开发票的金额) */
    private BigDecimal invoiceAmount;
    /** 用户在交易中支付的金额 */
    private BigDecimal buyerPayAmount;
    /** 集分宝金额(使用集分宝支付的金额) */
    private BigDecimal pointAmount;
    /** 总退款金额 */
    private BigDecimal refundFee;
    /** 订单标题 */
    private String subject;
    /** 商品描述 */
    private String body;
    /** 交易创建时间(该笔交易创建的时间) */
    private Date gmtCreate;
    /** 交易付款时间 */
    private Date gmtPayment;
    /** 交易退款时间 */
    private Date gmtRefund;
    /** 交易结束时间 */
    private Date gmtClose;
    /** 支付金额信息(支付成功的各个渠道金额信息) */
    private List<AliResFundBill> fundBillList;
    /** 优惠券信息 */
    private List<AliResVoucherDetail> voucherDetailList;
    /** 回传参数(公共回传参数,如果请求时传递了该参数,则返回给商户时会在异步通知时将该参数原样返回) */
    private String passbackParams;
    /** 支付宝转账订单号 */
    private String orderId;
    /** 支付宝支付资金流水号 */
    private String payFundOrderId;
    /** 转账单据状态 */
    private String status;
    /** 订单支付时间，格式为yyyy-MM-dd HH:mm:ss */
    private String transDate;
    /** 错误码 */
    @JsonIgnore
    private String errcode;
    /** 错误信息 */
    @JsonIgnore
    private String errmsg;
    /** 统一状态Bean */
    private Status cusStatus;

    public AliResponse() {}

    /** 成功返回 */
    public AliResponse(Integer code) {
        this(code, null);
    }

    /** 返回失败 */
    public AliResponse(Integer code, String msg) {
        this(new Status(code, msg));
    }

    /** 返回失败 */
    public AliResponse(TransErrorCode transErrorCode) {
        this(new Status(transErrorCode.getCode(), transErrorCode.getMsg()));
    }

    public AliResponse(Status status) {
        setCusStatus(status);
    }

    /** 获取通知的发送时间 */
    public Date getNotifyTime() {
        return notifyTime;
    }

    /** 设置通知的发送时间 */
    @JsonProperty("notify_time")
    @JSONField(name = "notify_time")
    public void setNotifyTime(Date notifyTime) {
        this.notifyTime = notifyTime;
    }

    /** 获取 通知类型 */
    public String getNotifyType() {
        return notifyType;
    }

    /** 设置 通知类型 */
    @JsonProperty("notify_type")
    @JSONField(name = "notify_type")
    public void setNotifyType(String notifyType) {
        this.notifyType = notifyType;
    }

    /** 获取 通知校验ID */
    public String getNotifyId() {
        return notifyId;
    }

    /** 设置 通知校验ID */
    @JsonProperty("notify_id")
    @JSONField(name = "notify_id")
    public void setNotifyId(String notifyId) {
        this.notifyId = notifyId;
    }

    /** 获取 响应内容编码格式 */
    public String getCharset() {
        return charset;
    }

    /** 设置 响应内容编码格式 */
    public void setCharset(String charset) {
        this.charset = charset;
    }

    /** 获取 调用的接口版本 */
    public String getVersion() {
        return version;
    }

    /** 设置 调用的接口版本 */
    public void setVersion(String version) {
        this.version = version;
    }

    /** 获取 签名类型 */
    public String getSignType() {
        return signType;
    }

    /** 设置 签名类型 */
    @JsonProperty("sign_type")
    @JSONField(name = "sign_type")
    public void setSignType(String signType) {
        this.signType = signType;
    }

    /** 获取 签名 */
    public String getSign() {
        return sign;
    }

    /** 设置 签名 */
    public void setSign(String sign) {
        this.sign = sign;
    }

    /** 获取 授权方的 appid(由于某些接口暂不开放第三方应用授权,因此auth_app_id=app_id) */
    public String getAuthAppId() {
        return authAppId;
    }

    /** 设置 授权方的 appid(由于某些接口暂不开放第三方应用授权,因此auth_app_id=app_id) */
    @JsonProperty("auth_app_id")
    @JSONField(name = "auth_app_id")
    public void setAuthAppId(String authAppId) {
        this.authAppId = authAppId;
    }

    /** 获取 用户授权码  */
    public String getAuthCode() {
        return authCode;
    }

    /** 设置 用户授权码 */
    @JsonProperty("auth_code")
    @JSONField(name = "auth_code")
    public void setAuthCode(String authCode) {
        this.authCode = authCode;
    }

    /** 获取  商户自定义参数 */
    public String getState() {
        return state;
    }

    /** 设置 商户自定义参数 */
    public void setState(String state) {
        this.state = state;
    }

    /** 获取  授权范围 */
    public String getScope() {
        return scope;
    }

    /** 设置 授权范围 */
    public void setScope(String scope) {
        this.scope = scope;
    }

    /** 获取 支付宝交易凭证号 */
    public String getTradeNo() {
        return tradeNo;
    }

    /** 设置 支付宝交易凭证号 */
    @JsonProperty("trade_no")
    @JSONField(name = "trade_no")
    public void setTradeNo(String tradeNo) {
        this.tradeNo = tradeNo;
    }

    /** 获取 开发者的Appid */
    public String getAppId() {
        return appId;
    }

    /** 设置 开发者的Appid */
    @JsonProperty("app_id")
    @JSONField(name = "app_id")
    public void setAppId(String appId) {
        this.appId = appId;
    }

    /** 获取 商户订单号 */
    public String getOutTradeNo() {
        return outTradeNo;
    }

    /** 设置 商户订单号 */
    @JsonProperty("out_trade_no")
    @JSONField(name = "out_trade_no")
    public void setOutTradeNo(String outTradeNo) {
        this.outTradeNo = outTradeNo;
    }

    /** 获取 退款回调为(商户业务号(商户业务ID,主要是退款通知中返回退款申请的流水号,商户的退款单号)),转账为(商户订单号) */
    public String getOutBizNo() {
        return outBizNo;
    }

    /** 设置 退款回调为(商户业务号(商户业务ID,主要是退款通知中返回退款申请的流水号,商户的退款单号)),转账为(商户订单号) */
    @JsonProperty("out_biz_no")
    @JSONField(name = "out_biz_no")
    public void setOutBizNo(String outBizNo) {
        this.outBizNo = outBizNo;
    }

    /** 获取 买家支付宝用户号(买家支付宝账号对应的支付宝唯一用户号,以2088开头的纯16位数字) */
    public String getBuyerId() {
        return buyerId;
    }

    /** 设置 买家支付宝用户号(买家支付宝账号对应的支付宝唯一用户号,以2088开头的纯16位数字) */
    @JsonProperty("buyer_id")
    @JSONField(name = "buyer_id")
    public void setBuyerId(String buyerId) {
        this.buyerId = buyerId;
    }

    /** 获取 卖家支付宝用户号(买家支付宝账号对应的支付宝唯一用户号,以2088开头的纯16位数字) */
    public String getSellerId() {
        return sellerId;
    }

    /** 设置 卖家支付宝用户号(买家支付宝账号对应的支付宝唯一用户号,以2088开头的纯16位数字) */
    @JsonProperty("seller_id")
    @JSONField(name = "seller_id")
    public void setSellerId(String sellerId) {
        this.sellerId = sellerId;
    }

    /** 获取 交易状态 */
    public String getTradeStatus() {
        return tradeStatus;
    }

    /** 设置 交易状态 */
    @JsonProperty("trade_status")
    @JSONField(name = "trade_status")
    public void setTradeStatus(String tradeStatus) {
        this.tradeStatus = tradeStatus;
    }

    /** 获取 订单金额(本次交易支付的订单金额) */
    public BigDecimal getTotalAmount() {
        return totalAmount;
    }

    /** 设置 订单金额(本次交易支付的订单金额) */
    @JsonProperty("total_amount")
    @JSONField(name = "total_amount")
    public void setTotalAmount(BigDecimal totalAmount) {
        this.totalAmount = totalAmount;
    }

    /** 获取 实收金额(商家在交易中实际收到的款项) */
    public BigDecimal getReceiptAmount() {
        return receiptAmount;
    }

    /** 设置 实收金额(商家在交易中实际收到的款项) */
    @JsonProperty("receipt_amount")
    @JSONField(name = "receipt_amount")
    public void setReceiptAmount(BigDecimal receiptAmount) {
        this.receiptAmount = receiptAmount;
    }

    /** 获取 开票金额(用户在交易中支付的可开发票的金额) */
    public BigDecimal getInvoiceAmount() {
        return invoiceAmount;
    }

    /** 设置 开票金额(用户在交易中支付的可开发票的金额) */
    @JsonProperty("invoice_amount")
    @JSONField(name = "invoice_amount")
    public void setInvoiceAmount(BigDecimal invoiceAmount) {
        this.invoiceAmount = invoiceAmount;
    }

    /** 获取 用户在交易中支付的金额 */
    public BigDecimal getBuyerPayAmount() {
        return buyerPayAmount;
    }

    /** 设置 用户在交易中支付的金额 */
    @JsonProperty("buyer_pay_amount")
    @JSONField(name = "buyer_pay_amount")
    public void setBuyerPayAmount(BigDecimal buyerPayAmount) {
        this.buyerPayAmount = buyerPayAmount;
    }

    /** 获取 集分宝金额(使用集分宝支付的金额) */
    public BigDecimal getPointAmount() {
        return pointAmount;
    }

    /** 设置 集分宝金额(使用集分宝支付的金额) */
    @JsonProperty("point_amount")
    @JSONField(name = "point_amount")
    public void setPointAmount(BigDecimal pointAmount) {
        this.pointAmount = pointAmount;
    }

    /** 获取 总退款金额 */
    public BigDecimal getRefundFee() {
        return refundFee;
    }

    /** 设置 总退款金额 */
    @JsonProperty("refund_fee")
    @JSONField(name = "refund_fee")
    public void setRefundFee(BigDecimal refundFee) {
        this.refundFee = refundFee;
    }

    /** 获取 订单标题 */
    public String getSubject() {
        return subject;
    }

    /** 设置 订单标题 */
    public void setSubject(String subject) {
        this.subject = subject;
    }

    /** 获取 商品描述 */
    public String getBody() {
        return body;
    }

    /** 设置 商品描述 */
    public void setBody(String body) {
        this.body = body;
    }

    /** 获取 交易创建时间(该笔交易创建的时间) */
    public Date getGmtCreate() {
        return gmtCreate;
    }

    /** 设置 交易创建时间(该笔交易创建的时间) */
    @JsonProperty("gmt_create")
    @JSONField(name = "gmt_create")
    public void setGmtCreate(Date gmtCreate) {
        this.gmtCreate = gmtCreate;
    }

    /** 获取 交易付款时间 */
    public Date getGmtPayment() {
        return gmtPayment;
    }

    /** 设置 交易付款时间 */
    @JsonProperty("gmt_payment")
    @JSONField(name = "gmt_payment")
    public void setGmtPayment(Date gmtPayment) {
        this.gmtPayment = gmtPayment;
    }

    /** 获取 交易退款时间 */
    public Date getGmtRefund() {
        return gmtRefund;
    }

    /** 设置 交易退款时间 */
    @JsonProperty("gmt_refund")
    @JSONField(name = "gmt_refund")
    public void setGmtRefund(Date gmtRefund) {
        this.gmtRefund = gmtRefund;
    }

    /** 获取 交易结束时间 */
    public Date getGmtClose() {
        return gmtClose;
    }

    /** 设置 交易结束时间 */
    @JsonProperty("gmt_close")
    @JSONField(name = "gmt_close")
    public void setGmtClose(Date gmtClose) {
        this.gmtClose = gmtClose;
    }

    /** 获取 支付金额信息(支付成功的各个渠道金额信息) */
    public List<AliResFundBill> getFundBillList() {
        return fundBillList;
    }

    /** 设置 支付金额信息(支付成功的各个渠道金额信息) */
    // @JsonProperty("fund_bill_list")
    // @JSONField(name = "fund_bill_list")
    public void setFundBillList(List<AliResFundBill> fundBillList) {
        this.fundBillList = fundBillList;
    }

    /** 设置 支付金额信息(支付成功的各个渠道金额信息) */
    @JsonProperty("fund_bill_list")
    @JSONField(name = "fund_bill_list")
    public void setFundBillList(String fundBillList) {
        this.fundBillList = JsonUtil.jsonToList(fundBillList, AliResFundBill.class);
    }

    /** 获取 优惠券信息 */
    public List<AliResVoucherDetail> getVoucherDetailList() {
        return voucherDetailList;
    }

    /** 设置 优惠券信息 */
    // @JsonProperty("voucher_detail_list")
    // @JSONField(name = "voucher_detail_list")
    public void setVoucherDetailList(List<AliResVoucherDetail> voucherDetailList) {
        this.voucherDetailList = voucherDetailList;
    }

    /** 设置 优惠券信息 */
    @JsonProperty("voucher_detail_list")
    @JSONField(name = "voucher_detail_list")
    public void setVoucherDetailList(String voucherDetailList) {
        this.voucherDetailList = JsonUtil.jsonToList(voucherDetailList, AliResVoucherDetail.class);
    }

    /** 获取 回传参数(公共回传参数,如果请求时传递了该参数,则返回给商户时会在异步通知时将该参数原样返回) */
    public String getPassbackParams() {
        return passbackParams;
    }

    /** 设置 回传参数(公共回传参数,如果请求时传递了该参数,则返回给商户时会在异步通知时将该参数原样返回) */
    @JsonProperty("passback_params")
    @JSONField(name = "passback_params")
    public void setPassbackParams(String passbackParams) {
        this.passbackParams = passbackParams;
    }

    /** 获取 支付宝转账订单号 */
    public String getOrderId() {
        return orderId;
    }

    /** 设置 支付宝转账订单号 */
    @JsonProperty("order_id")
    @JSONField(name = "order_id")
    public void setOrderId(String orderId) {
        this.orderId = orderId;
    }

    /** 获取 支付宝支付资金流水号 */
    public String getPayFundOrderId() {
        return payFundOrderId;
    }

    /** 设置 支付宝支付资金流水号 */
    @JsonProperty("pay_fund_order_id")
    @JSONField(name = "pay_fund_order_id")
    public void setPayFundOrderId(String payFundOrderId) {
        this.payFundOrderId = payFundOrderId;
    }

    /** 获取 转账单据状态 */
    public String getStatus() {
        return status;
    }

    /** 设置 转账单据状态 */
    public void setStatus(String status) {
        this.status = status;
    }

    /** 获取 订单支付时间，格式为yyyy-MM-dd HH:mm:ss */
    public String getTransDate() {
        return transDate;
    }

    /** 设置 订单支付时间，格式为yyyy-MM-dd HH:mm:ss */
    @JsonProperty("trans_date")
    @JSONField(name = "trans_date")
    public void setTransDate(String transDate) {
        this.transDate = transDate;
    }

    /** 获取错误码 */
    public String getErrcode() {
        return errcode;
    }

    /** 设置错误码 */
    public void setErrcode(String errcode) {
        this.errcode = errcode;
    }

    /** 获取错误信息 */
    public String getErrmsg() {
        return errmsg;
    }

    /** 设置错误信息 */
    public void setErrmsg(String errmsg) {
        this.errmsg = errmsg;
    }

    /** 获取统一状态Bean */
    public Status getCusStatus() {
        return cusStatus;
    }

    /** 设置统一状态Bean */
    public void setCusStatus(Status cusStatus) {
        this.cusStatus = cusStatus;
    }

}